﻿using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class MeshRendererBatch
{
    public void Start(Transform transform)
    {
        if(transform.GetComponent<MeshRenderer>() == null)
            transform.gameObject.AddComponent<MeshRenderer>();

        if (transform.GetComponent<MeshFilter>() == null)
            transform.gameObject.AddComponent<MeshFilter>();

        // 获取自身和所有子物体中所有的MeshFilter组件
        MeshFilter[] meshFilters = transform.GetComponentsInChildren<MeshFilter>();
        // 新建CombineInstance数组 
        CombineInstance[] combine = new CombineInstance[meshFilters.Length];
        // 获取自身和所有子物体中所有MeshRenderer组件 
        MeshRenderer[] meshRenderer = transform.GetComponentsInChildren<MeshRenderer>();
        // 新建材质球数组
        Material[] mats = new Material[meshRenderer.Length];

        int meshLen = meshFilters.Length;
        for (int i = 0; i < meshLen; i++)
        {
            // 获取材质球列表
            mats[i] = meshRenderer[i].sharedMaterial;
            // 获取网格
            combine[i].mesh = meshFilters[i].sharedMesh;
            // 获取位置
            combine[i].transform = transform.worldToLocalMatrix * meshFilters[i].transform.transform.localToWorldMatrix;
            //			combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
            // 隐藏子物体
            meshFilters[i].gameObject.SetActive(false);

        }
        // 新建一个Mesh
        transform.GetComponent<MeshFilter>().mesh = new Mesh();
        // 为mesh.CombineMeshes添加一个 false 参数，表示并不是合并为一个网格，而是一个子网格列表 
        transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine, false);
        // 为合并后的GameObject指定材质
        transform.GetComponent<MeshRenderer>().sharedMaterials = mats;

        transform.gameObject.SetActive(true);
    }
}
